package pl.siwoz.search.engine;

import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.vaadin.addon.sqlcontainer.SQLContainer;
import com.vaadin.addon.sqlcontainer.connection.J2EEConnectionPool;
import com.vaadin.addon.sqlcontainer.query.FreeformQuery;

public class SearchEngine {

	private static Logger logger = Logger.getLogger("SearchEngine");

	private static J2EEConnectionPool j2eeConnectionPool;
	
	public SearchEngine() throws SQLException {
		if (null != (j2eeConnectionPool = new J2EEConnectionPool(
				"java:/comp/env/jdbc/postgres"))) {
			logger.log(Level.INFO, "Connection pool successfully created.");
		}
	}

	public SQLContainer search(final String query) throws SQLException {
		FreeformQuery produkty = new FreeformQuery(
				"select DISTINCT p.nazwa_produktu as Nazwa, s.nazwa_substancji_aktywnej as Dopasowana_substancja_aktywna, fp.ilosc_ddd as Ilosc, fp.jednostka_ddd as jednostka "
						+ "from rzeczywiste_produkty r natural join formulacje f "
						+ "natural join substancje s "
						+ "natural join produkty p "
						+ "join formy_produktu fp on (r.id_formy_produktu = fp.id_forma_produktu) "
						+ "where s.nazwa_substancji_aktywnej in("
						+ "select distinct s.nazwa_substancji_aktywnej "
						+ "from rzeczywiste_produkty r natural join formulacje f "
						+ "natural join substancje s "
						+ "natural join produkty p "
						+ "where p.nazwa_produktu Ilike '%"
						+ query
						+ "') and fp.ilosc_ddd is not null and fp.jednostka_ddd is not null",
				j2eeConnectionPool);
		SQLContainer container = new SQLContainer(produkty);
		return container;
	}

	public SQLContainer search(final String query, final String substance,
			boolean appearance) throws SQLException {
		if (appearance == false) {
			FreeformQuery produkty = new FreeformQuery(
					"select DISTINCT ON (p.nazwa_produktu) p.nazwa_produktu as Nazwa, s.nazwa_substancji_aktywnej as Dopasowana_substancja_aktywna, fp.ilosc_ddd as Ilosc, fp.jednostka_ddd as jednostka "
							+ "from rzeczywiste_produkty r natural join formulacje f "
							+ "natural join substancje s "
							+ "natural join produkty p "
							+ "join formy_produktu fp on (r.id_formy_produktu = fp.id_forma_produktu) "
							+ "where s.nazwa_substancji_aktywnej in("
							+ "select distinct s.nazwa_substancji_aktywnej "
							+ "from rzeczywiste_produkty r natural join formulacje f "
							+ "natural join substancje s "
							+ "natural join produkty p "
							+ "where p.nazwa_produktu Ilike '%"
							+ query
							+ "%') and p.nazwa_produktu not in( "
							+ "select distinct p.nazwa_produktu "
							+ "from rzeczywiste_produkty r natural join formulacje f "
							+ "natural join substancje s "
							+ "natural join produkty p "
							+ "where s.nazwa_substancji_aktywnej = '"
							+ substance
							+ "') and fp.ilosc_ddd is not null and fp.jednostka_ddd is not null",
					j2eeConnectionPool);

			SQLContainer container = new SQLContainer(produkty);
			return container;
		} else {
			FreeformQuery produkty = new FreeformQuery(
					"select DISTINCT ON (p.nazwa_produktu) p.nazwa_produktu as Nazwa, s.nazwa_substancji_aktywnej as Dopasowana_substancja_aktywna, fp.ilosc_ddd as Ilosc, fp.jednostka_ddd as jednostka "
							+ "from rzeczywiste_produkty r natural join formulacje f "
							+ "natural join substancje s "
							+ "natural join produkty p "
							+ "join formy_produktu fp on (r.id_formy_produktu = fp.id_forma_produktu) "
							+ "where s.nazwa_substancji_aktywnej in("
							+ "select distinct s.nazwa_substancji_aktywnej "
							+ "from rzeczywiste_produkty r natural join formulacje f "
							+ "natural join substancje s "
							+ "natural join produkty p "
							+ "where p.nazwa_produktu Ilike '%"
							+ query
							+ "%') and p.nazwa_produktu in( "
							+ "select distinct p.nazwa_produktu "
							+ "from rzeczywiste_produkty r natural join formulacje f "
							+ "natural join substancje s "
							+ "natural join produkty p "
							+ "where s.nazwa_substancji_aktywnej = '"
							+ substance
							+ "') and fp.ilosc_ddd is not null and fp.jednostka_ddd is not null",
					j2eeConnectionPool);
			SQLContainer container = new SQLContainer(produkty);
			return container;
		}
	}

	public SQLContainer search(final Object query) throws SQLException {
		return this.search(query.toString());
	}

	public void close() {
		if (null != j2eeConnectionPool) {
			j2eeConnectionPool.destroy();
		}
	}
}
